let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/tjsmc')
var Schema = mongoose.Schema;
var stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type: String,
        default: "female"
    },
    address: String
});


//model代表数据库集合，参数一：集合名称,但是成功之后，数据库中是students，mongoose会自动
//把名称变成复数，所以可以命名直接加上s，避免不必要的困扰
var StuModel = mongoose.model("student", stuSchema)


/**
 * 特别说明：理论上，数据库任何操作，只要有model即可，
 * 所以上的可以抽离出去
 * 而且连接数据库和schema因为可能多处使用，所以最好也分开
 */








/**
 * Model.create(doc(s),[callback]) 
 *  - 用来创建一个或多个文档并添加到数据库中
 *  - 参数：
 *      doc(s) 可以是一个文档对象，也可以是文档对象的数组 
 */
// StuModel.create({
//     name: "顺悟空1",
//     age: 20,
//     gender: "female",
//     address: "花果山2"
// }, (err) => {
//     if (err) {
//         console.log(err)
//     } else {
//         console.log("插入成功")
//     }
// })

/**
 * Model.find(conditions,[projection],[options],[callback])
 *  - 查询所有符合条件的文档,返回数组
 * Model.findById(id,[projection],[options],[callback])
 *  - 根据文档的id属性查询文档
 * Model.findOne([conditions],[projection],[options],[callback])
 * - 查询符合条件的第一个文档,返回具体对象
 * 
 * conditions:查询条件
 * projection：投影
 * options：查询选项，（skip limit等）
 * callback: 查询结果通过回调查回来
 */
// StuModel.find({ name: "顺悟空" }, (err, docs) => {
//     if (!err) {
//         console.log(docs)
//         /**
//          * [ { gender: 'male',
//     _id: 5b407a90f99dac1cf4fba82e,
//     name: '顺悟空',
//     age: 18,
//     address: '花果山',
//     __v: 0 } ]
//          */
//     }
// })
//如果不要某个参数，但是需要后面参数，可以通过null跳过
// StuModel.find({ name: "顺悟空" }, { name: 1, _id: 0 }, (err, docs) => {
//     if (!err) {
//         console.log(docs)
//         /**
//          * [ { name: '顺悟空' } ]
//          */
//     }
// })
//下面写法如果不想要id 则"name gender -id"
// StuModel.find({ name: "顺悟空" }, "name gender", (err, docs) => {
//     if (!err) {
//         console.log(docs)
//         /**
//          * [ { gender: 'male', _id: 5b407a90f99dac1cf4fba82e, name: '顺悟空' } ]
//          */
//     }
// })

//其他查询方式需要ObjectId("5b407a90f99dac1cf4fba82e"),只有该方法可以直接传入字符串id
StuModel.findById("5b407a90f99dac1cf4fba82e",{name:1,age:1,address:1,gender:1}, (err, doc) => {
    if (!err) {
        // console.log(doc)
        //doc就是Document，文档对象，Document对象就是model的实例
        // console.log(doc instanceof StuModel);//true
        /**
         * { gender: 'male',
            _id: 5b407a90f99dac1cf4fba82e,
            name: '顺悟空',
            age: 18,
            address: '花果山',
            __v: 0 }
         */

         /**
          * Document相关
          * update(update,[options],[callback])
          * remove([callback])
          * save([options],[fn]) #代表是对象调用
          */
        doc.update({$set:{age:20}},(err)=>{
            if(!err){
                console.log("修改成功")
            }
        })
        //下面效果同上
        // doc.age=30;
        // doc.save();


        

        /**
         * get(name):获取文档中的指定属性值
         * set(name,vale):设置文档的指定的属性值
         */
        // console.log(doc.get("name"))//直接doc.name也行

        doc.set("name","新修改的值");
        doc.name="呵呵";//等效上一行
        //删除
        doc.remove((err)=>{
            if(!err){
                console.log("删除成功!")
            }
        })
        console.log(doc.id);//获取的是文档的id,或者_id  

        /**
         * toJson:转换为一个json字符串
         * toObject:将document转换为一个普通的js对象
         */
        console.log(doc.toJson())
        console.log(doc.toObject())
    }
})


//修改
/**
 * Model.update(conditions,doc,[options],[callback])
 * Model.updateMany(conditions,doc,[options],[callback])
 * Model.updateOne(conditions,doc,[options],[callback])
 * Model.replaceOne(conditions,doc,[options],[callback])
 */
// StuModel.updateOne({name:"顺悟空"},{$set:{age:50}},(err)=>{
//     if(!err){
//         console.log("修改成功")
//     }
// })

/**
 * 删除：
 * Model.remove(conditions,[callback])
 * Model.deleteOne(conditions,[callback])
 * Model.deleteMany(conditions,[callback])
 */
/**
 * Model.count(conditions,[callback])
 * 统计文档的数量,此时针对find,虽然也能得到数量，但是find是先查一遍，性能低
 */

// ---------------------------------------

/**
 * Document和集合中的文档一一对应，Document是model的实例
 */
//创建document
// var stu=new StuModel({
//     name:"本博巴",
//     age:49,
//     gender:"male",
//     address:"碧波谭"
// })
/**
 * document的方法，
 *  Model#save([options],[fn]) #代表是对象调用
 */
// stu.save((err)=>{
//     if(!err){
//         console.log("保存成功")
//     }
// })



mongoose.connection.once("open", () => {
    console.log("连接成功")
})
mongoose.connection.once("close", () => {

})
// 断开数据库连接
// mongoose.disconnect()